#!/bin/sh

ParallelsDesktop30Uninstaller="${1}/Contents/Resources/pd30uninstaller.h"

if [ -e "/Library/Parallels/Parallels Service.app/Contents/Resources/Uninstaller.sh" ]; then
	ParallelsUninstallerScript="/Library/Parallels/Parallels Service.app/Contents/Resources/Uninstaller.sh"
elif [ -e "/Library/Parallels/Parallels Server.app/Contents/Resources/Uninstaller.sh" ]; then
	ParallelsUninstallerScript="/Library/Parallels/Parallels Server.app/Contents/Resources/Uninstaller.sh"
else
	ParallelsUninstallerScript="${1}/Contents/Resources/ps30uninstaller.h"
fi

#Remove kexts from Parallels Desktop 4.0.3810 and older
RemoveOldKexts()
{
	rm -rf /System/Library/Extensions/prl_hid_hook.kext
	rm -rf /System/Library/Extensions/prl_hypervisor.kext
	rm -rf /System/Library/Extensions/prl_netbridge.kext
	rm -rf /System/Library/Extensions/prl_usb_connect.kext
	rm -rf /System/Library/Extensions/prl_vnic.kext
	touch /System/Library/Extensions/
}

CheckProcessRunning()
{
	! ps -w -w -A -ocommand 2>/dev/null | grep -nq "^${1}"
}

# Check for installed Parallels Desktop 3.0 and uninstall it
if [ -d '/System/Library/Extensions/hypervisor.kext' ] || \
	[ -d '/Incompatible Software/hypervisor.kext' ]; then
	# Check no PD3 vm running
	if ! CheckProcessRunning "Parallels\( Desktop\)\?.app/Contents/MacOS/[P]arallels"; then
		exit 113
	fi	

	# Check no PD3 applications running
	if ! CheckProcessRunning "Parallels\( Desktop\)\?.app/Contents/MacOS/[P]arallels"; then
		exit 113
	fi	

	if ! CheckProcessRunning "\(Parallels Image \)\?Tool.app/Contents/MacOS/[I]mage[T]ool" ; then
		exit 113
	fi	

	if ! CheckProcessRunning "Parallels Transporter.app/Contents/MacOS/" ; then
		exit 113
	fi	

	if ! CheckProcessRunning "Parallels Explorer.app/Contents/MacOS/" ; then
		exit 113
	fi	

	"${ParallelsDesktop30Uninstaller}"
fi
if [ -d '/System/Library/Extensions/hypervisor.kext' ] || \
	[ -d '/Incompatible Software/hypervisor.kext' ]; then
	exit 112
fi

# Copy receipts to place where Uninstaller expect 'em
logger -p install.info -t 'Parallels' "Snow Leopard receipts switcheroo section"
if [ -d "/var/db/receipts" ]; then
	logger -p install.info -t 'Parallels' "Will copy receipts"
	receipts_old_dir="/Library/Parallels/Parallels Service.app/Contents/Receipts"
	receipts_dir="/var/db/receipts"
	pd4_receipt_old="${receipts_old_dir}/Parallels Desktop 4.pkg/Contents/Archive.bom"
	pd4_receipt="${receipts_dir}/com.parallels.desktop.bom"
	pe4_receipt_old="${receipts_old_dir}/Parallels Explorer 4.pkg/Contents/Archive.bom"
	pe4_receipt="${receipts_dir}/com.parallels.desktop.explorer.bom"
	pit4_receipt_old="${receipts_old_dir}/Parallels Image Tool 4.pkg/Contents/Archive.bom"
	pit4_receipt="${receipts_dir}/com.parallels.server.imagetool.bom"
	pt4_receipt_old="${receipts_old_dir}/Parallels Transporter 4.pkg/Contents/Archive.bom"
	pt4_receipt="${receipts_dir}/com.parallels.server.transporter.bom"
	pdr106_receipt_old="${receipts_old_dir}/Parallels Drivers 10.6.pkg/Contents/Archive.bom"
	pdr106_receipt="${receipts_dir}/com.parallels.desktop.drivers.106"

	# Desktop package
	if [ -e "${pd4_receipt_old}" -a ! -e "${pd4_receipt}" ]; then
		cp -f "${pd4_receipt_old}" "${pd4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt desktop copied with status $?"
	fi

	# Explorer package
	if [ -e "${pe4_receipt_old}" -a ! -e "${pe4_receipt}" ]; then
		cp -f "${pe4_receipt_old}" "${pe4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt explorer copied with status $?"
	fi

	# Image Tool package
	if [ -e "${pit4_receipt_old}" -a ! -e "${pit4_receipt}" ]; then
		cp -f "${pit4_receipt_old}" "${pit4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt imagetool copied with status $?"
	fi

	# Transporter package
	if [ -e "${pt4_receipt_old}" -a ! -e "${pt4_receipt}" ]; then
		cp -f "${pt4_receipt_old}" "${pt4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt transporter copied with status $?"
	fi

	# Drivers 10.6 package
	if [ -e "${pdr106_receipt_old}" -a ! -e "${pdr106_receipt}" ]; then
		cp -f "${pdr106_receipt_old}" "${pdr106_receipt}"
		logger -p install.info -t 'Parallels' "Receipt drivers 10.6 copied with status $?"
	fi
fi

if [ -d "/Library/Receipts/Install Parallels Server.pkg" ] || \
   [ -d "/Library/Receipts/Parallels Server 3.pkg" ] || \
   [ -d "/Library/Parallels/Parallels Service.app/Contents/Receipts/Parallels Server 3.pkg" ] || \
   [ -d "/Library/Parallels/Parallels Service.app/Contents/Receipts/Parallels Server 4.pkg" ] || \
   [ -f "/var/db/receipts/com.parallels.server.server" ]; then
	"${ParallelsUninstallerScript}" server
fi

check_service_ver()
{
	plist_file="/Library/Parallels/Parallels Service.app/Contents/Info.plist"
	grep -s -A 1 CFBundleShortVersionString "$plist_file" | grep -q "${1}\.0"
	return $?
}

check_pd_ver_installed()
{
	if [ -d "/Library/Receipts/Parallels Desktop ${1}.pkg" \
		   -o -d "/Library/Parallels/Parallels Service.app/Contents/Receipts/Parallels Desktop ${1}.pkg" \
		   -o -f "/var/db/receipts/com.parallels.desktop.plist"\
		   -o -f "/var/db/receipts/com.parallels.pkg.desktop.plist" ]; then
		check_service_ver "$1"
		return $?
	fi

	return 1
}

if check_pd_ver_installed 4; then
	"${ParallelsUninstallerScript}" desktop
elif check_pd_ver_installed 5; then
	"${ParallelsUninstallerScript}" --keep-video desktop
elif check_pd_ver_installed 6; then
	"${ParallelsUninstallerScript}" --keep-stm-stuff desktop
fi

check_stm_ver_installed()
{
	if [ -d "/Library/Receipts/Parallels Switch To Mac ${1}.pkg" \
		   -o -f "/var/db/receipts/com.parallels.stm.plist" \
		   -o -d "/Library/Parallels/Parallels Service.app/Contents/Receipts/Parallels Switch To Mac ${1}.pkg" ]; then
		check_service_ver "$1"
		return $?
	fi

	return 1
}

if check_stm_ver_installed 4; then
	"${ParallelsUninstallerScript}" --keep-video stm
elif check_stm_ver_installed 5; then
	"${ParallelsUninstallerScript}" --keep-stm-stuff stm
fi

RemoveOldKexts


StopDispatcher() {
	if [ -d "/Library/StartupItems/ParallelsDispatcherService" ]; then
		SystemStarter stop ParallelsDispatcherService
	fi
	
	if [ -f "/Library/LaunchDaemons/com.parallels.server.launchdaemon.plist" ]; then
		launchctl stop com.parallels.server.launchdaemon
		launchctl unload /Library/LaunchDaemons/com.parallels.server.launchdaemon.plist
		if [ -e "/Library/Parallels/Parallels Server.app/Contents/Resources/ParallelsDispatcherService" ]; then
			/Library/Parallels/Parallels\ Server.app/Contents/Resources/ParallelsDispatcherService stop
		fi
		if [ -e "/Library/Parallels/Parallels Service.app/Contents/Resources/ParallelsDispatcherService" ]; then
			/Library/Parallels/Parallels\ Service.app/Contents/Resources/ParallelsDispatcherService stop
		fi
	fi
	if [ -f "/Library/LaunchDaemons/com.parallels.stm.launchdaemon.plist" ]; then
		launchctl stop com.parallels.server.launchdaemon
		launchctl unload /Library/LaunchDaemons/com.parallels.stm.launchdaemon.plist
		if [ -e "/Library/Parallels/Parallels Server.app/Contents/Resources/ParallelsDispatcherService" ]; then
			/Library/Parallels/Parallels\ Server.app/Contents/Resources/ParallelsDispatcherService stop
		fi
		if [ -e "/Library/Parallels/Parallels Service.app/Contents/Resources/ParallelsDispatcherService" ]; then
			/Library/Parallels/Parallels\ Service.app/Contents/Resources/ParallelsDispatcherService stop
		fi
	fi
	
	sleep 5

	if ! CheckProcessRunning "/Library/Parallels/Parallels Server.app/Contents/PlugIns/Parallels VM.app/Contents/MacOS/prl_vm_app"; then
		return 1
	fi

	if ! CheckProcessRunning "/Library/Parallels/Parallels Service.app/Contents/MacOS/prl_vm_app"; then
		return 1
	fi
	
}

if ! StopDispatcher; then
	echo $?
	#  This is a proper way to stop running
	# dispatcher
	if pid=`cat /var/run/prl_disp_service.pid`; then
		echo "Stopping Parallels Dispatcher (${pid})"
		kill -TERM "${pid}" 2>/dev/null
	fi

	#  FIXME: previous action should be enough
	#  But just in case will duck and cover...
	echo 'Sending TERM signal to Parallels dispatcher service' 
	killall -TERM prl_disp_service 2>/dev/null

	sleep 2

	echo 'Sending KILL signal to Parallels dispatcher service'
	killall -KILL prl_disp_service 2>/dev/null

	#  Stop VMs
	#  Will do it hard way this time
	echo 'Sending TERM signal to Parallels virtual machines' 
	killall -TERM prl_vm_app 2>/dev/null

	sleep 2

	echo 'Sending KILL signal to Parallels virtual machines' 
	killall -KILL prl_vm_app 2>/dev/null

fi

# Check for running VMs
if ps -w -w -A -ocommand | grep -nq '^/Library/Parallels/Parallels Server.app/Contents/PlugIns/Parallels VM.app/Contents/MacOS/prl_vm_app'; then
	logger -p install.info -t 'Parallels' "VMs are running after dispatcher shutdown"

	#  This is a proper way to stop running
	# dispatcher
	if pid=`cat /var/run/prl_disp_service.pid`; then
		echo "Stopping Parallels Dispatcher (${pid})"
		kill -TERM "${pid}" 2>/dev/null
	fi

	#  FIXME: previous action should be enough
	#  But just in case will duck and cover...
	echo 'Sending TERM signal to Parallels dispatcher service' 
	killall -TERM prl_disp_service 2>/dev/null

	sleep 2

	echo 'Sending KILL signal to Parallels dispatcher service'
	killall -KILL prl_disp_service 2>/dev/null

	#  Stop VMs
	#  Will do it hard way this time
	echo 'Sending TERM signal to Parallels virtual machines' 
	killall -TERM prl_vm_app 2>/dev/null

	sleep 2

	echo 'Sending KILL signal to Parallels virtual machines' 
	killall -KILL prl_vm_app 2>/dev/null
fi

# Try to unload MacFUSE kext
kextunload -b com.google.filesystems.fusefs

if [ -e "/Library/StartupItems/ParallelsDispatcherService/ParallelsDispatcherService" ]; then
    /Library/StartupItems/ParallelsDispatcherService/ParallelsDispatcherService ext-unload
elif [ -e "/Library/Parallels/Parallels Service.app/Contents/Resources/ParallelsDispatcherService" ]; then
	/Library/Parallels/Parallels\ Service.app/Contents/Resources/ParallelsDispatcherService stop-net
	/Library/Parallels/Parallels\ Service.app/Contents/Resources/ParallelsDispatcherService ext-unload
fi

# Backup config file
#mv /Library/Preferences/Parallels/dispatcher.xml \
#   /Library/Preferences/Parallels/dispatcher-`date +%Y-%m-%d-%H-%M-%S`-bkp.xml
#mv /Library/Preferences/Parallels/vmdirectorylist.xml \
#   /Library/Preferences/Parallels/vmdirectorylist-`date +%Y-%m-%d-%H-%M-%S`-bkp.xml

exit 0
